﻿using System.Security.Cryptography.X509Certificates;

namespace est7
{
    internal class class7
    {
        #region     知识点一   基本概念
        //函数（方法）
        //本质是一块具有名称的代码块
        //可以使用函数（方法）的名称来执行该代码块
        //函数（方法）是封装代码进行重复使用的一种机制

        //函数（方法）的主要作用
        //1.封装代码
        //2.提升代码复用率
        //3.抽象行为
        #endregion
        #region     知识点二   函数写在哪里
        //1.写在class语句中
        //2.还有struct语句中
        #endregion
        #region     知识点三   基本语法
        //  1       2       3                   4
        //static 返回类型 函数名(参数类型 参数名1,参数类型 参数名2,........)
        //{
        //      函数的代码逻辑;
        //      函数的代码逻辑;
        //      ...............
        //             5
        //      return 返回值;（如果有返回类型才返回）
        //}
        //1.关于static 不是必须的  但在没有学习类和结构体之前 都是必须写的

        //2-1.关于返回类型 引出一个新的关键字 void（表示没有返回值）
        //2-2.返回类型可以写任意变量类型 14种变量类型+复杂数据类型（数组、枚举、结构体、类class）

        //3.关于函数名 使用帕斯卡命名法   MyName

        //4-1 参数不是必须的，可以有0到n个参数 参数类型也可以是任意类型的 14种变量类型+复杂数据类型
        //    多个参数的时候需要用逗号隔开
        //4-2 参数名 驼峰命名法

        //5.当返回值类型不为void时 必须通过新的关键词 return返回对应类型的内容 （注意：即使是void亦可以选择性地使用return）
        #endregion
        #region     知识点四   实际应用
        //1.无参数无返回值函数
        //1     2       3   4
        static void CharLie()
        {
            Console.WriteLine("hello!");
            //在没有返回值时 也就是返回值类型时void时 可以省略（return）
            //return
        }

        //2.有参数无返回值函数
        //1     2     3     4
        static void GeJi(string name)
        {
            Console.WriteLine("我是{0}",name);

        }

        //3.无参数有返回值函数
        //1       2     3
        static string MySelf()
        {
            //5
            return "秦洛南";
        }

        //4.有参数有返回值函数
        static int num(int a, int b)
        {
            //int c = a + b;
            //return c;
            //5     return后面可以写一个表达式 只要这个表达式的结果和返回值类型一致就行
            return a + b;
        }

        //5.有参数有多返回值函数

        //传入两个数然后计算两个数的和 以及他们的平均数 得出结果返回出来
        //函数的返回值 一定是一个类型 只能是一个内容
        static int[] num2(int c,int d)
        {
            int num = c + d;
            int num2 = num / 2;
            //两个值及以上放数组里返回
            //int[] arr = {num, num2};
            //return arr;
            return new int[] { num, num2 };
        }
        #endregion

        #region     知识点五   关于return
        //即使函数没有返回值  也可以使用return
        //return可以直接不执行之后的代码 直接返回到函数外部

        static string print(string str)
        {
            if( str == "fuck" )
            {
                return "这样可不行哦";
            }
            return str;
        }
        #endregion
        static void Main(string[] args)
        {
            Console.WriteLine("函数");
             
            //使用函数 直接写函数名（参数） 即可
            CharLie();
            
            //参数可以是常量、变量、函数都可以
            //参数 一定是传一个 能得到对应类型的表达式
            string str = "Len";
            //传入一个string变量
            GeJi(str);
            //传入一个dtring常量
            GeJi("Rin");

            //这是传入一个返回值是string的函数（嵌套）
            GeJi(MySelf());
            //有返回值的函数 要不直接拿返回值来用
            //要不就是拿变量 接收他的结果
            string str2 = MySelf();
            Console.WriteLine(str2);
            //也可以直接调用 但是返回值对我们来说就没用了
            MySelf();

            Console.WriteLine(num(2,3));

            int[] arr=num2(2,6);//先用容器装起来
            Console.WriteLine(arr[0]+" " + arr[1]);

            string str3 = "miku";
            Console.WriteLine(print(str3));
        }
    }
}
